package keer.httpinterface.proxy;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;

/**
 * JacksonJsonCodec类继承自JsonCodec，用于提供JSON的序列化与反序列化功能
 * 它利用了Jackson库中的ObjectMapper来处理JSON数据
 * @see JsonCodec
 * @see ObjectMapper
 *
 * @author Keer
 * @since 1.0.0
 */
public class JacksonJsonCodec extends JsonCodec {
    // 定义一个静态的ObjectMapper实例，用于JSON处理
    private final static ObjectMapper MAPPER;

    // 静态代码块用于初始化ObjectMapper，并配置其属性
    static {
        MAPPER = new ObjectMapper();
        // 设置序列化时，只包含非空的属性
        MAPPER.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        // 配置反序列化时，忽略未知属性，避免失败
        MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, Boolean.FALSE);
        // 配置反序列化时，允许单个值作为数组处理
        MAPPER.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, Boolean.TRUE);
        // 配置JSON解析时，允许使用单引号
        MAPPER.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, Boolean.TRUE);
        // 配置JSON解析时，允许字段名不加引号
        MAPPER.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, Boolean.TRUE);
    }

    /**
     * 编码方法，将对象序列化为JSON字符串
     *
     * @param object 待序列化的对象
     * @return JSON字符串表示的对象
     * @throws Exception 如果序列化过程中发生错误
     */
    @Override
    public String encode0(Object object) throws Exception {
        return MAPPER.writeValueAsString(object);
    }

    /**
     * 解码方法，将JSON字符串反序列化为指定类型的对象
     *
     * @param json JSON字符串
     * @param clazz 指定类型的目标类
     * @return 反序列化后的对象实例
     * @throws Exception 如果反序列化过程中发生错误
     */
    @Override
    public <T> T decode0(String json, Class<T> clazz) throws Exception {
        return MAPPER.readValue(json, clazz);
    }

}
